﻿using iTextSharp.text;
using iTextSharp.text.pdf;
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;

namespace CreatePdf
{
    class Program
    {
        static void Main(string[] args)
        {
            //生成pdf
            Document document = new Document();

            var fileStream = File.Create("测试.pdf");
            PdfWriter pw = PdfWriter.GetInstance(document, fileStream);
            document.Open();
            //指定字体文件，IDENTITY_H：支持中文
            string fontpath = "simkai.ttf";
            BaseFont customfont = BaseFont.CreateFont(fontpath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);

            //设置字体颜色样式
            var baseFont = new Font(customfont)
            {
                Color = new BaseColor(System.Drawing.Color.Black),  //设置字体颜色
                Size = 12  //字体大小
            };

            #region 头部
            //定义table行列数据
            PdfPTable tableRow_1 = new PdfPTable(1);  //生成只有一列的行数据
            tableRow_1.DefaultCell.Border = Rectangle.NO_BORDER;  //无边框
            tableRow_1.DefaultCell.MinimumHeight = 40f; //高度
            float[] headWidths_1 = new float[] { 500f }; //宽度
            tableRow_1.SetWidths(headWidths_1);

            //定义字体样式
            var headerStyle = new Font(customfont)
            {
                Color = new BaseColor(System.Drawing.Color.Black),
                Size = 18,
            };
            var Row_1_Cell_1 = new PdfPCell(new Paragraph("用户列表", headerStyle));
            Row_1_Cell_1.HorizontalAlignment = Element.ALIGN_CENTER;//居中
            tableRow_1.AddCell(Row_1_Cell_1);

            PdfPTable tableRow_2 = new PdfPTable(5);
            tableRow_2.DefaultCell.Border = Rectangle.NO_BORDER;
            tableRow_2.DefaultCell.MinimumHeight = 40f;
            float[] headWidths_2 = new float[] { 80f, 100f, 80f, 100f, 140f };
            tableRow_2.SetWidths(headWidths_2);

            var Row_2_Cell_1 = new PdfPCell(new Paragraph("姓名", baseFont));
            tableRow_2.AddCell(Row_2_Cell_1);

            var Row_2_Cell_2 = new PdfPCell(new Paragraph("手机号", baseFont));
            tableRow_2.AddCell(Row_2_Cell_2);

            var Row_2_Cell_3 = new PdfPCell(new Paragraph("性别", baseFont));
            tableRow_2.AddCell(Row_2_Cell_3);

            var Row_2_Cell_4 = new PdfPCell(new Paragraph("出生日期", baseFont));
            tableRow_2.AddCell(Row_2_Cell_4);

            var Row_2_Cell_5 = new PdfPCell(new Paragraph("身份证号", baseFont));
            tableRow_2.AddCell(Row_2_Cell_5);


            document.Add(tableRow_1);
            document.Add(tableRow_2);
            #endregion

            #region 填充List数据
            var users = new List<User>()
            {
                 new User
                 {
                      Name="旺旺",
                      Phone ="13000000000",
                      Gender = "男",
                      Birthday="1900-01-01",
                      IdCard = "111111111111111111"
                 },
                  new User
                  {
                      Name="李四",
                      Phone ="13000000001",
                      Gender = "男",
                      Birthday="1900-01-01",
                      IdCard = "111111111111111112"
                  }
            };
          
            Type t = new User().GetType();//获得该类的Type

            for (int i = 0; i < users.Count; i++)
            {
                PdfPTable tableRow_3 = new PdfPTable(5);
                tableRow_3.DefaultCell.Border = Rectangle.NO_BORDER;
                tableRow_3.DefaultCell.MinimumHeight = 40f;
                float[] headWidths_3 = new float[] { 80f, 100f, 80f, 100f, 140f };
                tableRow_3.SetWidths(headWidths_3);
                foreach (PropertyInfo pi in t.GetProperties())  //遍历属性值
                {
                    var value = pi.GetValue(users[i]).ToString();
                    var txt = new Paragraph(value, baseFont);
                    var cell = new PdfPCell(txt);
                    tableRow_3.AddCell(cell);
                }
                document.Add(tableRow_3);
            }
               
            #endregion

            //页脚
            PDFFooter footer = new PDFFooter();
            footer.OnEndPage(pw, document);
            document.Close();
            fileStream.Dispose();
        }


    }

    public class User
    {
        public string Name { get; set; }
        public string Phone { get; set; }
        public string Gender { get; set; }
        public string Birthday { get; set; }
        public string IdCard { get; set; }
    }

    public class PDFFooter : PdfPageEventHelper
    {
        // write on top of document
        public override void OnOpenDocument(PdfWriter writer, Document document)
        {
            base.OnOpenDocument(writer, document);
            PdfPTable tabFot = new PdfPTable(new float[] { 1F });
            tabFot.SpacingAfter = 10F;
            PdfPCell cell;
            tabFot.TotalWidth = 300F;
            cell = new PdfPCell(new Phrase("Header"));
            tabFot.AddCell(cell);
            tabFot.WriteSelectedRows(0, -1, 150, document.Top, writer.DirectContent);
        }

        // write on start of each page
        public override void OnStartPage(PdfWriter writer, Document document)
        {
            base.OnStartPage(writer, document);
        }

        // write on end of each page
        public override void OnEndPage(PdfWriter writer, Document document)
        {
            base.OnEndPage(writer, document);
            //PdfPTable tabFot = new PdfPTable(new float[] { 1F });
            //tabFot.TotalWidth = 700f;
            //tabFot.DefaultCell.Border = 0;
              var footFont = FontFactory.GetFont("Lato", 12 * 0.667f, new BaseColor(60, 60, 60));
            //string fontpath = HttpContext.Current.Server.MapPath("~/App_Data");
            //BaseFont customfont = BaseFont.CreateFont(fontpath + "\\Lato-Regular.ttf", BaseFont.CP1252, BaseFont.EMBEDDED);
            //var footFont = new Font(customfont, 12 * 0.667f, Font.NORMAL, new Color(170, 170, 170));

            //PdfPCell cell;
            //cell = new PdfPCell(new Phrase("@ 2016 . All Rights Reserved", footFont));
            //cell.VerticalAlignment = Element.ALIGN_CENTER;
            //cell.Border = 0;
            //cell.PaddingLeft = 100f;
            //tabFot.AddCell(cell);
            //tabFot.WriteSelectedRows(0, -1, 150, document.Bottom, writer.DirectContent);
        }

        //write on close of document
        public override void OnCloseDocument(PdfWriter writer, Document document)
        {
            base.OnCloseDocument(writer, document);
        }
    }
}
